#include "Double_list.h"

// 初始化
Link_list *init_link_list(void)
{
    Link_list *L = (Link_list *)malloc(sizeof(Link_list));
    if (NULL == L)
    {
        printf("创建失败！");
    }
    L->next = NULL;
    return L;
}
// // 尾插
// void tail_insert_node(Link_list *list, Elenemt_data data)
// { // 创建节点

// }
// // 中间插
// void insert_node(Link_list *list, Elenemt_data data, int pos)
// {
//     if (NULL == list)
//     {
//         printf("list为NULL\n");
//         return;
//     }
//     if (0 >= pos)
//     {
//         printf("请不要乱搞\n");
//     }

//     // 定义新节点
//     Node *new_node = (Node *)malloc(sizeof(Node));
//     if (NULL == new_node)
//     {
//         printf("创建失败！");
//         return;
//     }
//     // 给新结点赋值
//     new_node->data = data;
//     new_node->next = new_node;
//     new_node->prev = new_node;
//     // 定义一个节点的指针
//     Node *ptr = list->next;
//     // 表内无数据情况
//     if (list->next == NULL)
//     {
//         list->next = new_node;
//         return;
//     }
//      //    任意位置插
//     for (int i = 1; i < pos - 1; i++)
//     {
//         ptr = ptr->next;
//     }
//     // 新节点的next指向后一个节点
//     new_node->next = ptr->next;
//     // 后一个节点的前指针指向新节点
//     ptr->next->prev = new_node;
//     // 前一个节点的后指针指向新节点；
//     ptr->next = new_node;
//     // 新节点的前指针指向前一个结点
//     new_node->prev = ptr;
//     if (pos == 1)
//     {
//         list->next = new_node;
//     }

//     return;
// }
void insert_node(Link_list *list, Elenemt_data data, int pos)
{
    if (NULL == list)
    {
        printf("list为NULL\n");
        return;
    }
    if (0 >= pos)
    {
        printf("请不要乱搞\n");
    }

    // 定义新节点
    Node *new_node = (Node *)malloc(sizeof(Node));
    if (NULL == new_node)
    {
        printf("创建失败！");
        return;
    }
    // 给新结点赋值
    new_node->data = data;
    new_node->next = new_node;
    new_node->prev = new_node;
    // 定义一个节点的指针
    Node *ptr = list->next;
    // 头插

    // 表内无数据情况
    if (list->next == NULL)
    {
        list->next = new_node;
        return;
    }
    // 表内有数据的情况
    if (1 == pos)
    { // 最后一个节点的next指向新节点
        ptr->prev->next = new_node;
        // 新节点的prev指向尾节点
        new_node->prev = ptr->prev;
        // 新节点的next指向ptr节点
        new_node->next = ptr;
        // ptr的prev指向新节点
        ptr->prev = new_node;
        // 头节点指向新节点
        list->next = new_node;
        return;
    }
    // 任意位置插
    for (int i = 1; i < pos - 1; i++)
    {
        ptr = ptr->next;
    }
    // 新节点的next指向后一个节点
    new_node->next = ptr->next;
    // 后一个节点的前指针指向新节点
    ptr->next->prev = new_node;
    // 前一个节点的后指针指向新节点；
    ptr->next = new_node;
    // 新节点的前指针指向前一个结点
    new_node->prev = ptr;

    return;
}
// 任意位置删
void delete_node(Link_list *list, int pos)
{
    if (NULL == list)
    {
        printf("list为NULL\n");
        return;
    }
    if (0 >= pos)
    {
        printf("请不要乱搞\n");
    }
    if (NULL == list->next)
    {
        printf("数据为NULL\n");
        return;
    }

    if (list->next == list->next->next && 1 == pos)
    {
        free(list->next);
        list->next = NULL;
        printf("已输出第一个\n");
        return;
    }

    // 创建链表指针
    Node *ptr1 = list->next;
    Node *ptr2 = ptr1->next;
    // 头删
    if (1 == pos)
    { // 头节点指向第二个节点
        list->next = ptr1->next;
        // 第二个节点头节点指向最后一个节点
        ptr2->prev = ptr1->prev;
        // 最后一个节点的尾节点指向第二个节点
        ptr1->prev->next = ptr2;
        // 释放第一个节点
        free(ptr1);
        return;
    }
    // // 任意位置删
    // int i = 1;
    // do
    // {
    //     i++;
    //     ptr1 = ptr1->next;
    // } while (i < pos-1 && ptr1->next != list->next  );
    for (int i = 1; i < pos -1 ; i++)
    {
        ptr1 = ptr1->next;
        if(list->next == ptr1->next)
        {   
            printf("超出链表范围\n");
            return;
        }
    }
    

    ptr2 = ptr1->next;
    ptr1->next = ptr2->next;
    ptr2->next->prev = ptr1;
    return;
}

// 名字查数据
int find_node_name(Link_list *list, char *name)
{
    if (NULL == list)
    {
        printf("list为NULL\n");
        return EOF;
    }
    if (NULL == list->next)
    {
        printf("表内无数据\n");
        return EOF;
    }

    Node *ptr = list->next;
    int i = 0;
    do
    {
        i++;
        if (!strcmp(ptr->data.name, name))
        {
            printf("找到了这个账号 \n");
            return i;
        }
        ptr = ptr->next;
    } while (ptr != list->next);
    printf("没有找到！\n");
    return EOF;
}

// 清空youwenti
void clear_link_list(Link_list *list)
{
    if (NULL == list)
    {
        printf("list为NULL\n");
        return;
    }
    if (NULL == list->next)
    {
        printf("list.next为NULL\n");
        return;
    }
    if (list->next == list->next->next)
    {
        printf("表内一个数据,已清空\n");
        free(list->next);
        list->next = NULL;
        return;
    }
    Node *ptr1 = list->next;
    Node *ptr2 = list->next;
    do
    { 
        free(ptr1);
        ptr1 = ptr2;
        ptr2 = ptr2->next;
    } while (list->next != ptr1);
    list->next = NULL;
    return;
}
//  遍历
void print_link_list(Link_list *list)
{
    if (NULL == list)
    {
        printf("list为NULL\n");
        return;
    }
    if (NULL == list->next)
    {
        printf("表内无数据\n");
        return;
    }
    Node *ptr = list->next;
    // for (int i = 0; list->next != ptr->next; i++)
    do
    {
        printf("账号%s\t 密码%s\t  身份 %c\n",
               ptr->data.name, ptr->data.word, ptr->data.level);
        ptr = ptr->next;
    } while (list->next != ptr);

    // for (int i = 0; list->next != ptr->next; i++)
    // {
    //     printf("bbbbbb\n");
    //     printf("账号%s\t 密码%s\t  身份 %c\n",
    //            ptr->data.name, ptr->data.word, ptr->data.level);
    //     ptr = ptr->next;
    // }
}
// 销毁
void free_link_list(Link_list **list)
{
    if (NULL == *list)
    {
        printf("数据为NULL\n");
        return;
    }
    if (NULL == (*list)->next)
    {
        printf("表内无数据,已销毁头节点\n");
        free(*list);
        *list = NULL;
        return;
    }
    if ((*list)->next == (*list)->next->next)
    {
        printf("表内一个数据,已销毁\n");
        free((*list)->next);
        free(*list);
        *list = NULL;
        return;
    }
    Node *ptr1 = (*list)->next;
    Node *ptr2 = (*list)->next;
    do
    { // 将最后一个节点指向NULL用做判断
        ptr1->prev->next = NULL;
        free(ptr1);
        ptr1 = ptr2;
        ptr2 = ptr2->next;
    } while (NULL != ptr1);
    free(*list);
    (*list)->next = NULL;
    return;
}